1. /* sxmcvdec.cpp by K.Tsuru */
  2. // function ID = 503 BRADIX
  3. /*************************************
  4. SDecimal class
  5. radix conversion BRADIX --> DRADIX
  6. normal method
  7. **************************************/
  8. #ifndef SN_H
  9. #include "sn.h"
  10. #endif
  11. SDouble SDecimal::NConvToDec() const{
  12. if(RawSign() == 0) return 0.0;
  13. if(aHead == 0){ //integral part only
  14. SDouble I;
  15. I = RawSign()*(int)figure(0);
  16. return I;
  17. }
  18. SDouble result(REAL, SNMaxSize(REAL));
  19. SDecimal a(*this);
  20. uint rsz = result.Size(), asz =a.Size();
  21. a.SetSign(1);
  22. fType* av = a.figure.Elements();
  23. fType* rv = result.figure.Elements();
  24. //Conversion of decimal part
  25. result.rdxExp = 0;
  26. uint at, i, rh, rt;
  27. for(i = 1; i < rsz ; i++) {
  28. av[0] = 0;
  29. if(!av[a.aTail]){ //Position of "aTail" moved by av[0] = 0 when a.aTail = 0.
  30. at = a.aTail;
  31. while(!av[at] && (at < asz)) at++;
  32. if(at == asz){ // a == 0
  33. a.aTail = a.aHead = 0; a.SetSign(0); break;
  34. }
  35. a.aTail = at;
  36. }
  37. XsMult(a, DRADIX, a); //Position of "a.aHead" is decided in XsMult().
  38. rv[i] = av[0];
  39. }
  40. i = min(i, rsz-1);
  41. while(!rv[i] && (i>0) ) i--;
  42. rh = i;
  43. i = 0;
  44. while(!rv[i] && (i < rh) ) i++;
  45. rt = i;
  46. result.aTail = rt;
  47. result.aHead = rh;
  48. result.SetSign( int(rv[rt]) );
  49. //Add integer part.
  50. if(figure(0) != 0){
  51. //Not rv[0] = figure(0) because it is possible figure(0) >= DRADIX.
  52. result = DDAdd(result, figure(0));
  53. }
  54. result.CutDown(result.POP);
  55. result.Reform(503);
  56. if(result.Sign(503) != 0) result.SetSign(RawSign());
  57. return result;
  58. }

sxmcvdec.cpp : last modifiled at 2017/03/13 14:32:02(1,561 bytes)
created at 2015/12/22 16:09:56
The creation time of this html file is 2017/10/27 15:45:59 (Fri Oct 27 15:45:59 2017).